package com.wl.dzt.sys.controller.param.shir;


import com.wl.dzt.sys.controller.param.Param;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * <b>拦截bean</b>
 * <p>
 * 类似拦截器<br>
 * 拦截核心控制器的 之前之后以及中间<br>
 * </p>
 */
/**
 * @author wl_code@163.com
 * @date 2018/7/5/005
 * @version 1.0
 * @description 拦截bean
 * 拦截核心控制器的 之前之后以及中间
 * 
 */
public class ShirBean {
	/**
	 * 是否之前
	 */
	private boolean isBefore = false;

	/**
	 * 是否之后
	 */
	private boolean isAfter = false;

	/**
	 * 是否中间
	 */
	private boolean isMiddle = false;

	/**
	 * 当前实体
	 */
	private Object bean;

	/**
	 * 方法
	 */
	private Method method;

	public boolean isBefore() {
		return isBefore;
	}

	public void setBefore(boolean isBefore) {
		this.isBefore = isBefore;
	}

	public boolean isAfter() {
		return isAfter;
	}

	public void setAfter(boolean isAfter) {
		this.isAfter = isAfter;
	}

	public Object getBean() {
		return bean;
	}

	public void setBean(Object bean) {
		this.bean = bean;
	}

	public Method getMethod() {
		return method;
	}

	public void setMethod(Method method) {
		this.method = method;
	}

	public boolean isMiddle() {
		return isMiddle;
	}

	public void setMiddle(boolean isMiddle) {
		this.isMiddle = isMiddle;
	}

	/**
	 * <b>执行之前的函数</b>
	 * <p>
	 * 在触发核心控制器函数之前执行
	 * </p>
	 *
	 * @param param
	 *            请求参数
	 * @return 是否继续执行后面的代码
	 */
	public boolean doBefore(Param param) {
		try {
			Object result = method.invoke(this.bean, param);
			if (result == null) {
				throw new RuntimeException("拦截之前函数 " + method.getName() + "() 必须返回boolean值");
			}
			return (boolean) result;
		} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
			e.printStackTrace();
		}
		return false;
	}

	/**
	 * <b>执行之后的函数</b>
	 * <p>
	 * 在触发核心控制器函数之后执行
	 * </p>
	 * 
	 * @param param
	 *            web参数
	 */
	public void doAfter(Param param) {
		try {
			method.invoke(this.bean, param);
		} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
			e.printStackTrace();
		}
	}

	/**
	 * <b>执行中间的函数</b>
	 * <p>
	 * 拦截并且能手动调用核心控制器中函数调用
	 * </p>
	 * 
	 * @param handler
	 *            中间拦截器
	 * @return url地址
	 */
	public String doMiddle(ShirHandler handler) {
		try {
			return (String) method.invoke(this.bean, handler);
		} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
			e.printStackTrace();
		}
		return null;
	}

}
